using jiuyuan.数据.基础数据类;
using jiuyuan.数据.玩家类;
using jiuyuan.管理器;
using System.Collections.Concurrent;

namespace jiuyuan.服务;

// 玩家决策请求
public class 玩家决策请求
{
    public Guid 战斗Id { get; set; }
    public 玩家 玩家 { get; set; } = null!;
    public TaskCompletionSource<AI决策?> 决策任务 { get; set; } = new TaskCompletionSource<AI决策?>();
}

// 玩家决策服务
public class 玩家决策服务
{
    private readonly ConcurrentDictionary<Guid, 玩家决策请求> _待处理决策 = new ConcurrentDictionary<Guid, 玩家决策请求>();
    
    /// <summary>
    /// 请求玩家决策
    /// </summary>
    public async Task<AI决策?> 请求玩家决策(Guid 战斗Id, 玩家 玩家)
    {
        var 请求 = new 玩家决策请求
        {
            战斗Id = 战斗Id,
            玩家 = 玩家
        };
        
        _待处理决策[战斗Id] = 请求;
        
        // 等待决策完成或超时
        using var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(30)); // 30秒超时
        try
        {
            return await 请求.决策任务.Task.WaitAsync(cancellationTokenSource.Token);
        }
        catch (OperationCanceledException)
        {
            // 超时，使用默认AI决策
            return null;
        }
        finally
        {
            _待处理决策.TryRemove(战斗Id, out _);
        }
    }
    
    /// <summary>
    /// 提交玩家决策
    /// </summary>
    public bool 提交玩家决策(Guid 战斗Id, AI决策 决策)
    {
        if (_待处理决策.TryGetValue(战斗Id, out var 请求))
        {
            请求.决策任务.SetResult(决策);
            return true;
        }
        return false;
    }
    
    /// <summary>
    /// 取消玩家决策请求
    /// </summary>
    public bool 取消玩家决策(Guid 战斗Id)
    {
        if (_待处理决策.TryGetValue(战斗Id, out var 请求))
        {
            请求.决策任务.SetCanceled();
            _待处理决策.TryRemove(战斗Id, out _);
            return true;
        }
        return false;
    }
}